package org.donald.service;

import org.donald.service.Defaulable.DefaultableImpl;
import org.donald.service.Defaulable.OverridableImpl;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;

/**
 * JVM平台的接口的默认方法实现是很高效的，并且方法调用的字节码指令支持默认方法。
 * 默认方法使已经存在的接口可以修改而不会影响编译的过程。
 * java.util.Collection中添加的额外方法就是最好的例子：stream(), parallelStream(), forEach(), removeIf()。
 * 虽然默认方法很强大，但是使用之前一定要仔细考虑是不是真的需要使用默认方法，
 * 因为在层级很复杂的情况下很容易引起模糊不清甚至编译错误。
 * @author donald
 * 2018年3月14日
 * 下午9:33:49
 */
public class InterfaceDemo {
	private static final Logger log = LoggerFactory.getLogger(InterfaceDemo.class);
	public static void main(String[] args) {
		Defaulable defaulable = DefaulableFactory.create( DefaultableImpl::new );
		log.info("DefaultableImpl:{}", defaulable.notRequired());
	 
	    defaulable = DefaulableFactory.create( OverridableImpl::new );
	    log.info("OverridableImpl:{}", defaulable.notRequired());

	}

}
